/**
 * function ListNode(val) {
        this.val = val
        this.next = null
    }
 */
// 快慢指针
// 给定的 n 保证是有效的
var removeNthFromEnd = function (head, n) {
    // 创建头节点
    let dummy = new ListNode()
    dummy.next = head
    let n1 = dummy
    let n2 = dummy

    // 法1：n2需要先移动n+1位，保证n1能指向需要删除的节点的前面一位
    for (let i = 0; i <= n; i++) {
        n2 = n2.next
    }
    while (n2 !== null) {
        n1 = n1.next
        n2 = n2.next
    }

    // 法2:n2需要先移动n位,但走到链表最后一个节点就可以停止
    for (let i = 0; i < n; i++) {
        n2 = n2.next
    }
    while (n2.next !== null) {
        n1 = n1.next
        n2 = n2.next
    }

    // 当n2为空，此时n1指向需要删除的节点的前面一个
    n1.next = n1.next.next

    return dummy.next
}